﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Core.Info
{
    /// <summary>
    /// 运行时信息
    /// </summary>
    public static class RunTimeInfo
    {

        /// <summary>
        /// 是否调试模式
        /// </summary>
        public static bool IsDebug { get; set; }

        /// <summary>
        /// 是否开发者模式
        /// </summary>
        public static bool IsDevelopment { get; set; }

        /// <summary>
        /// 是否调试语言资源
        /// </summary>
        public static bool IsDebugLanguageResource { get; set; } = false;

        /// <summary>
        /// 是否输出RestSharp日志的Curl <see cref="IsOutputRestSharpLog"/> 必须为true，该参数才能生效
        /// </summary>
        public static bool IsOutputRestSharpLogCurl { get; set; } = false;

        /// <summary>
        /// 是否输出RestSharp日志
        /// </summary>
        public static bool IsOutputRestSharpLog { get; set; } = false;

        /// <summary>
        /// 启动参数信息
        /// <para>  以"Key:&lt;=&gt;:Value"形式传递,每个参数使用空格分割，当需要传入 " 时，使用\"转义传递; </para>
        /// <para>参考："IsDebugLanguageResource:&lt;=&gt;:True" "IsDevelopment:&lt;=&gt;:True" "TestString:&lt;=&gt;:Test \" String Name" "TestString2:&lt;=&gt;:Test 123 \" ,, sd = " </para>
        /// </summary>
        public static StartArgsInfo StartArgsInfo { get; set; } = new StartArgsInfo(new List<string>());

        /// <summary>
        /// 是否显示创建和修改信息，主要控制编辑界面的显隐
        /// </summary>
        public static bool IsShowCreatedAndUpdatedInfo { get; set; } = true;

        /// <summary>
        /// 是否显示Sid信息，主要控制管理界面的显隐
        /// </summary>
        public static bool IsShowSidInfo { get; set; } = true;

        /// <summary>
        /// 是否显示Id信息，主要控制管理界面的显隐
        /// </summary>
        public static bool IsShowIdInfo { get; set; } = true;

        /// <summary>
        /// 锁定秒数
        /// </summary>
        public static int LockSeconds { get;set; } = 60;


        /// <summary>
        /// 从启动参数信息中初始化
        /// </summary>
        /// <param name="argsInfo">若参数为null，则此方法调用应当始终在 <see cref="StartArgsInfo.SetStartArgs(List{string})"/> 后调用</param>
        public static void InitStartArgsInfo(List<string>? argsInfo = null)
        {
            if (argsInfo != null)
            {
                StartArgsInfo.SetStartArgs(argsInfo);
            }
            IsDebug = StartArgsInfo.Get(nameof(StartArgsInfo.IsDebug), false);
            IsDevelopment = StartArgsInfo.Get(nameof(StartArgsInfo.IsDevelopment), false);
            IsDebugLanguageResource = StartArgsInfo.Get(nameof(StartArgsInfo.IsDebugLanguageResource), false);
            IsOutputRestSharpLogCurl = StartArgsInfo.Get(nameof(StartArgsInfo.IsOutputRestSharpLogCurl), false);
            IsOutputRestSharpLog = StartArgsInfo.Get(nameof(StartArgsInfo.IsOutputRestSharpLog), false);
            LockSeconds = StartArgsInfo.Get(nameof(StartArgsInfo.LockSeconds), 60);
        }

        /// <summary>
        /// 初始化系统环境
        /// <para>对.NET5+的编码格式进行增强</para>
        /// </summary>
        public static void InitSystemEnvironment()
        {
            //解决.NET Core（以及扩展名 ASP.NET Core）和 .NET 5 默认仅提供 Unicode 编码、ASCII 和 ISO-8859-1。
            //导致应用程序其他文本编码不可用的问题（主要表现为：GBK、GB18030乱码）。
            System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
        }

        /// <summary>
        /// Http服务Urls列表
        /// </summary>
        public static string? HttpServiceUrls { get; set; }
    }
}
